<?php
//菜单管理
class MenuModel {
	/**
	 * 得到当前登陆用户角色对应的菜单权限
	 * @param $is_array 只取数组,不要html结构(可选参数)
	 */
	public function getMenu($is_array=0){
		//SESSION菜单数组的md5唯一id为空 或 菜单数组缓存为空时
	   if(!My::user('myMenuCacheId') OR !($myMenu=My::getCache(My::user('myMenuCacheId').$is_array))){
			$menuArr = M('category')->item2submenu('menu',array('level'=>$is_array ? 3 : 2,'hasParent'=>true));//所有菜单列表,2个级数
			$myMenu = self::getMyMenu($menuArr);//得到当前角色的菜单(数组)
			$myMenuCacheId = md5(serialize($myMenu));//生成我的菜单数组的md5唯一id
			My::setCache($myMenuCacheId.$is_array,$myMenu);
			$_SESSION['myMenuCacheId'] = $myMenuCacheId;//session
		}
		//指定只返回菜单数组时
		//current
		$currentId = self::get_current($myMenu);//获得当前current菜单
		//echo $currentId;
		//print_r($myMenu);
		if(isset($myMenu[$currentId])){
			$myMenu[$currentId]['current'] = 'hover';
		}
		if($is_array==1)
			return $myMenu;
		//缓存->我的菜单数组序列化的md5为缓存的唯一标签
		else
			return self::menuArr2tree($myMenu);
	}
	
	private function getMyMenu($arr){//得到当前角色的菜单(数组)
		$roleid = (int)My::user('role_id');
		$mmm = DB('role')->where("id='{$roleid}'")->getField('module_ids');//以逗号分隔的限权id列表
		$result=array();
		$module = explode(',',$mmm);
		if($roleid==1) $module=My::arr2one($arr,'id');//超级管理员时全部菜单权限
		if(is_array($arr) AND is_array($module))
		foreach($arr as &$value){
			if(in_array($value['id'],$module)){
				$result[$value['id']] = $value;
			}
		}
		//print_r($result);
		return $result;
	}
	
	/**
	 * 菜单
	 */
	public function menuArr2tree($menuArr){
		$cacheId = md5(serialize($menuArr)).'menuArr2tree';
		$result = My::getCache($cacheId,array('pre'=>'category'));
		if(!$result){
			$result = list_to_tree($menuArr,'id','parent_id','_child',key($menuArr));
			My::setCache($cacheId,$result,array('pre'=>'category'));
		}
		return $result;
	}

	/**
	 * 菜单当前current定位
	 * CONTROLLER_NAME / ACTION_NAME
	 */
	public function get_current($arr=''){
		//get参数有指定menuid时直接返回
		if(My::is_id(My::arr2var($_GET,'menuid')) AND isset($arr[$_GET['menuid']]))
			return $_GET['menuid'];
		//print_r($arr);
		if(is_array($arr)){
			//当前页面网址
			$url = Router::decodeUrl();
			if($url=='' OR $url=='index.php?app=')
				return false;
			//判断是否有菜单current缓存存在
			$menuCurrent = My::getCache('menuCurrent_'.$url);
			if(My::is_id($menuCurrent))
				return $menuCurrent;
			//没有缓存则继续解释
			parse_str($url,$localUrl);//当前url
			foreach($arr as &$value){
				$temp_yes = 0;//相关度
				$temp_no = 0;//不相关度
				if(!empty($value['params']['link']) AND isset($value['level'])){
					parse_str($value['params']['link'],$temp_url);
					if(isset($temp_url['index_php?app']) AND isset($localUrl['index_php?app']) AND $temp_url['index_php?app']==$localUrl['index_php?app']){
						//当前循环url和当前页面Url比较相似度(元素命中率)
						if(is_array($temp_url)){
							foreach($temp_url as $v){
								if(is_array($localUrl))
								foreach($localUrl as $vv){
									if($vv==$v)
										$temp_yes++;
									else
										$temp_no++;
								}
							}
						}
					}
				}
				$value['similar_yes'] = $temp_yes;
				$value['similar_no'] = $temp_no;
			}
			//print_r($arr);
			//求similar_yes最大值
			$maxId = $max = 0;
			$min = 77;
			foreach($arr as $val){
				if($val['similar_yes']>=$max){
					$max = $val['similar_yes'];
					$maxId = $val['id'];
				}
			}
			//如有相似度相同的项,非匹配度similar_no超小越好
			foreach($arr as $val){
				if($val['similar_yes']==$max)
				if($val['similar_no']<=$min){
					$min = $val['similar_no'];
					$maxId = $val['id'];
				}
			}
			//echo $maxId;exit;
			My::getCache('menuCurrent_'.$url,$maxId);
			return $maxId;
		}
	}
	
}